home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / fd / open.c < prev    next >
C/C++ Source or Header  |  1990-06-20  |  2KB  |  120 lines

  1.  
  2. /*
  3.  *  OPEN.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <libraries/dos.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <fcntl.h>
  13. #include <errno.h>
  14.  
  15. _IOFDS *
  16. _MakeFD(pfd)
  17. int *pfd;
  18. {
  19.     int fd;
  20.     _IOFDS *d;
  21.  
  22.     /*
  23.      *    extend limit if required
  24.      */
  25.  
  26.     for (fd = 0, d = _IoFD; fd < _IoFDLimit; ++fd) {
  27.     if ((d->fd_Flags & O_ISOPEN) == 0)
  28.         break;
  29.     ++d;
  30.     }
  31.     if (fd == _IoFDLimit) {
  32.     short newLimit = fd + 5;
  33.     _IOFDS *fds = malloc(sizeof(_IOFDS) * newLimit);
  34.     if (fds == NULL) {
  35.         errno = ENOMEM;
  36.         return(NULL);
  37.     }
  38.     _slow_bzero(fds, sizeof(_IOFDS) * newLimit);
  39.     _slow_bcopy(_IoFD, fds, sizeof(_IOFDS) * fd);
  40.     if (_IoFD != _IoStaticFD)
  41.         free(_IoFD);
  42.     _IoFD = fds;
  43.     _IoFDLimit = newLimit;
  44.     d = fds + fd;
  45.     }
  46.     if (d)
  47.     _slow_bzero(d, sizeof(*d));
  48.     *pfd = fd;
  49.     return(d);
  50. }
  51.  
  52.  
  53. int
  54. open(name, modes)
  55. const char *name;
  56. int modes;
  57. {
  58.     int fd;
  59.     _IOFDS *d = _MakeFD(&fd);
  60.  
  61.     if (d == NULL)
  62.     return(-1);
  63.  
  64.     /*
  65.      *    If we can't lock then be careful to call Open only once.  Don't
  66.      *    bother to open if the IoErr() returns ERROR_DEVICE_NOT_MOUNTED
  67.      */
  68.  
  69.     {
  70.     long lock = Lock(name, SHARED_LOCK);
  71.     if (lock == NULL) {
  72.         if (IoErr() == ERROR_DEVICE_NOT_MOUNTED) {
  73.         errno = ENOFILE;
  74.         return(-1);
  75.         }
  76.         /*
  77.          *    file does not exist, open modes 1006 if create request, else
  78.          *    try to open modes 1005 (could be a non-file device)
  79.          */
  80.  
  81.         if (modes & O_CREAT)
  82.         d->fd_Fh = Open(name, 1006);
  83.         else
  84.         d->fd_Fh = Open(name, 1005);
  85.  
  86.         if (d->fd_Fh == NULL) {
  87.         errno = ENOFILE;
  88.         return(-1);
  89.         }
  90.         if (modes & O_APPEND)
  91.         Seek(d->fd_Fh, 0L, 1);
  92.         d->fd_Flags = modes | O_ISOPEN;
  93.         return(fd);
  94.     }
  95.     UnLock(lock);
  96.     }
  97.  
  98.     /*
  99.      *    Assume it is a normal file.. we can open/reopen it any
  100.      *    number of times.  Also, the file exists so...
  101.      */
  102.  
  103.     if (modes & O_TRUNC)
  104.     d->fd_Fh = Open(name, 1006);
  105.     else
  106.     d->fd_Fh = Open(name, 1005);
  107.  
  108.     if (d->fd_Fh == NULL && (modes & O_CREAT))  /*  case should never happen? */
  109.     d->fd_Fh = Open(name, 1006);
  110.  
  111.     if (d->fd_Fh) {
  112.     if (modes & O_APPEND)
  113.         Seek(d->fd_Fh, 0L, 1);
  114.     d->fd_Flags = modes | O_ISOPEN;
  115.     return(fd);
  116.     }
  117.     return(-1);
  118. }
  119.  
  120.